package com.breeze.base;

public class Main {

    public static void main(String[] args) {
        shiftTest();
    }

    /**
     * << >> >>>
     */
    public static void shiftTest() {
        // 左移总结：
        // 1. 左移动一位，则整体向左移动一位
        // 2. 当数值的最高位移动至头时，再移动时则截取后面剩余部分
        // 3. 当数值所有部分都移出时，例如 << 32 时相当于原数, eg 5 << 32 还是 5
        System.out.println("-------------------左移");
        show(1 << 1);
        show(1 << 31);
        show(1 << 32);
        show(1 << 33);
        show(5 << 32);
        show(-1);
        show(-1 << 10);
        show(-1 << 32);
        System.out.println("------------------ 右移");
        // 右移动总结:
        // 1. 正数移动，高位补0
        // 2. 负数移动，高位补0
        show(1 >> 1); // 0
        show(1 >> 100); // 0
        show(5 >> 1); // 2
        show(-1 >> 10); // -1
        System.out.println("-------------------无符号右移");
        // 无符号右移
        // 1. 符号位和其他位一样进行移动
        // 2. 当直接移动超过32时则恢复为原数
        show(5 >>> 1); // 2
        show(-1 >>> 31); // 1
        show(1 >>> 1); // 0
        show(1 >>> 32); // 1
        show(-1 >>> 32); // -1
    }

    private static void show(int num) {
        System.out.println("十进制:" + num);
        System.out.println("二进制:" + Integer.toBinaryString(num));
    }
}
